package com.itheima.health.controller;

import com.alibaba.druid.util.StringUtils;
import com.aliyuncs.exceptions.ClientException;
import com.itheima.health.constant.MessageConstant;
import com.itheima.health.constant.RedisMessageConstant;
import com.itheima.health.entity.Result;
import com.itheima.health.utils.SMSUtils;
import com.itheima.health.utils.ValidateCodeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.annotation.PostConstruct;

@RestController
@RequestMapping("/validateCode")
public class ValidateCodeController {

    //打印日志
    private static final Logger log = LoggerFactory.getLogger(ValidateCodeController.class);

    //连接池
    @Autowired
    private JedisPool jedisPool;

    /**
     * 发送验证码
     * @param telephone
     * @return
     */
    @PostMapping("/send4Order")
    public Result send4Order(String telephone){

        //获取连接池中的连接
        Jedis jedis = jedisPool.getResource();

        //然后再判断是否发送了验证码，从redis中获取
        // redis中的key要带上业务标识
        String key = RedisMessageConstant.SENDTYPE_ORDER + ":" + telephone;

        // redis中的验证码
        String codeInRedis = jedis.get(key);

        //用日志打印生成的验证码和手机号码
        log.debug("Redis中的验证码: {},{}",codeInRedis,telephone);

        //判断验证码是否生成
        if (!StringUtils.isEmpty(codeInRedis)){
            //不为空，则代表有值
            return new Result(false,"验证码已经发送过了，请注意查收!");
        }
        //如果为空，则生成验证码，生成一个长度为6的验证码
        String code = String.valueOf(ValidateCodeUtils.generateValidateCode(6));

        try {
            //调用SMSUtils发送
            SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code);
        } catch (ClientException e) {
            //用日志打印异常
           log.error("发送验证码失败！",e);

           //将异常信息发送给页面
            return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
        log.debug("生成验证码成功: {},{}",code,telephone);

        //将验证码存入redis，同时并设置有效期，一般为5-15分钟，获取折中10分钟
        jedis.setex(key,10*60,code + "");

        //关闭
        jedis.close();

        //将结果返回给页面
        return new Result(true,MessageConstant.SEND_VALIDATECODE_SUCCESS);
    }

    /**
     * 手机快速登录
     * @param telephone
     * @return
     */
    @PostMapping("/send4Login")
    public Result send4Login(String telephone){

        //获取连接
        Jedis jedis = jedisPool.getResource();

        //判断是否发送过验证码，从redis中获取，拼接key，并带上业务标识
        String key = RedisMessageConstant.SENDTYPE_LOGIN + ":" + telephone;

        //获取redis中的验证码
        String codeInRedis = jedis.get(key);

        //打印log日志
        log.debug("Redis中的验证码: {},{}",codeInRedis,telephone);

        //判断验证码是否生成
        if (!StringUtils.isEmpty(codeInRedis)){

            //不为空，代表有值，则说明发送过了
            return new Result(false, "验证码已经发送过了，请注意查收!");
        }
        //如果没发送，则生成验证码
        String code = String.valueOf(ValidateCodeUtils.generateValidateCode(6));

        try {
            //调用SMSUtils发送手机号，与验证码
            SMSUtils.sendShortMessage(SMSUtils.VALIDATE_CODE,telephone,code);

        } catch (ClientException e) {

            //打印log日志
            log.error("发送验证码失败",e);

            //返回给页面错误信息
            return new Result(false, MessageConstant.SEND_VALIDATECODE_FAIL);
        }
        //打印log日志
        log.debug("验证码发送成功: {},{}", code, telephone);

        //将验证码存入redis，同时要设置有效期，5-15分钟 10分钟
        jedis.setex(key,10*60,code);

        //关闭
        jedis.close();

        //返回结果给页面，发送验证码成功
        return new Result(true, MessageConstant.SEND_VALIDATECODE_SUCCESS);

    }
}
